package agentzia;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.text.*;
import java.util.*;
import java.net.MalformedURLException;
import java.rmi.*;

/**
 * Erreserbak kontrolatzeko klaseak.
 */

public class ErreserbaKontroladorea extends JPanel implements ActionListener,
        ItemListener {

    // Etiketak
    private JLabel etiketaErreserbaAgentea = new JLabel("Erreserba agentea");
    private JLabel etiketaPertsonaKopurua = new JLabel("Pertsona kopurua");
    private JLabel etiketaIrteerarenLekua = new JLabel("Irteeraren norakoa");
    private JLabel etiketaIrteerarenEgunak = new JLabel("Egun kopurua");
    private JLabel etiketaIrteeraData = new JLabel("Irteera Data");
    private JLabel etiketaBaieztapenZenbakia = new JLabel("Baieztapen zenbakia");
    private JLabel etiketaIzena = new JLabel("Izena");
    private JLabel etiketaHelbidea = new JLabel("Helbidea");
    private JLabel etiketaTelefonoa = new JLabel("Telefonoa");

    // Botoiak
    private JButton botoiaErreserbaBerria = new JButton("Erreserba berria");
    private JButton botoiaSartuIrteera = new JButton("Sartu erreserba");
    private JButton botoiaSartuTurista = new JButton("Sartu turista");
    private JButton botoiaSartuBidali = new JButton("Bidali");
    private JButton botoiaSartuEzeztatu = new JButton("Ezeztatu");

    // ComboBox-ak
    private JComboBox comboErreserbaAgentea = null;
    private JComboBox comboPertsonaKopurua = new JComboBox();
    private JComboBox comboIrteerarenLekua = new JComboBox();
    private JComboBox comboIrteerarenEgunak = new JComboBox();
    private JComboBox comboIrteeraData = new JComboBox();

    // Testu-eremuak
    private JTextField testuEremuaBaieztapenZenbakia = new JTextField();
    private JTextField testuEremuaIzena = new JTextField();
    private JTextField testuEremuaHelbidea = new JTextField();
    private JTextField testuEremuaTelefonoa = new JTextField();

    private ErreserbaSistema LoturaErreserbaSistema;
    private Irteerak LoturaIrteera;
    // Irteeren objektuak gordetzeko
    private Irteerak[] irteerakArray;

    public ErreserbaKontroladorea(ErreserbaSistema erreserbaSistema) {
        this.LoturaErreserbaSistema = erreserbaSistema;

        setLayout(new GridLayout(9, 3, 25, 25));
        setFont(new Font("Arial", Font.PLAIN, 12));
        setBackground(Color.lightGray);
        setBorder(BorderFactory.createEmptyBorder(25, 25, 25, 25));

        // Lortu agenteak eta bete ComboBox-a
        Vector<Agentea> agenteak;
        Agentea agentea;
        agenteak = AplikazioDatuBase.instance().getAgenteak();
        String agenteakStr[] = new String[agenteak.size() + 1];
        agenteakStr[0] = "Aukeratu agentea";
        for (int i = 0; i < agenteak.size(); i++) {
            agentea = agenteak.get(i);
            agenteakStr[i + 1] = (String) agentea.getIzena();
        }
        this.comboErreserbaAgentea = new JComboBox(agenteakStr);

        // errenkada 1
        add(etiketaErreserbaAgentea);
        add(comboErreserbaAgentea);
        add(new JLabel("            "));
        // errenkada 2
        add(etiketaIrteerarenLekua);
        add(comboIrteerarenLekua);
        add(new JLabel("            "));
        // errenkada 3
        add(etiketaPertsonaKopurua);
        add(comboPertsonaKopurua);
        add(botoiaErreserbaBerria);
        // errenkada 4
        add(etiketaIrteerarenEgunak);
        add(comboIrteerarenEgunak);
        add(new JLabel("            "));
        // errenkada 5
        add(etiketaIrteeraData);
        add(comboIrteeraData);
        add(new JLabel("            "));
        // errenkada 6
        add(etiketaBaieztapenZenbakia);
        add(testuEremuaBaieztapenZenbakia);
        add(botoiaSartuIrteera);
        // errenkada 7
        add(etiketaIzena);
        add(testuEremuaIzena);
        add(botoiaSartuTurista);
        // errenkada 8
        add(etiketaHelbidea);
        add(testuEremuaHelbidea);
        add(botoiaSartuBidali);
        // errenkada 9
        add(etiketaTelefonoa);
        add(testuEremuaTelefonoa);
        add(botoiaSartuEzeztatu);

        // Gehitu event listener-ak
        botoiaErreserbaBerria.addActionListener(this);
        botoiaSartuIrteera.addActionListener(this);
        comboErreserbaAgentea.addItemListener(this);
        comboIrteerarenLekua.addItemListener(this);
        comboIrteerarenEgunak.addItemListener(this);
        botoiaSartuTurista.addActionListener(this);
        botoiaSartuBidali.addActionListener(this);
        botoiaSartuEzeztatu.addActionListener(this);

        // Botoiak ipini
        botoiaErreserbaBerria.setEnabled(true);
        botoiaSartuIrteera.setEnabled(false);
        botoiaSartuTurista.setEnabled(false);
        botoiaSartuBidali.setEnabled(false);
        botoiaSartuEzeztatu.setEnabled(false);

        // Testu eremuak desgaitu
        testuEremuaBaieztapenZenbakia.setEnabled(false);
        testuEremuaIzena.setEnabled(false);
        testuEremuaHelbidea.setEnabled(false);
        testuEremuaTelefonoa.setEnabled(false);

        // ComboBox-ak desgaitu
//        comboIrteerarenLekua.setEnabled(false);
//        comboPertsonaKopurua.setEnabled(false);
//        comboIrteerarenEgunak.setEnabled(false);
//        comboIrteeraData.setEnabled(false);
    }

    public void actionPerformed(ActionEvent event) {
        NumberFormat numberFormat = NumberFormat.getCurrencyInstance();
        DateFormat dataFormat = DateFormat.getDateInstance();
        if (event.getSource() == botoiaErreserbaBerria) {
            // Lortu informazioa erreserba sortzeko
            String strNumberInParty = (String)comboPertsonaKopurua
                    .getSelectedItem();
            int pertsonaKopurua = Integer.parseInt(strNumberInParty);
            int irteeraKod = this.LoturaIrteera.getIrteeraKod();
            int baieztapenZenb = this.LoturaIrteera.getBaieztapenZenbakia();
            float prezioa = this.LoturaIrteera.getPrezioa();
            String agentea = (String) comboErreserbaAgentea.getSelectedItem();
            // Ereduak sartu
            LoturaErreserbaSistema.erreserbaBerria(pertsonaKopurua, agentea, irteeraKod, baieztapenZenb, prezioa);
            // Botoiak ipini
            botoiaErreserbaBerria.setEnabled(false);
            botoiaSartuIrteera.setEnabled(true);
            botoiaSartuTurista.setEnabled(false);
            botoiaSartuBidali.setEnabled(false);
            botoiaSartuEzeztatu.setEnabled(false);
            // Testu eremuen egoerak eguneratu
            //this.testuEremuaBaieztapenZenbakia.setText(String.valueOf(baieztapenZenb));
            testuEremuaBaieztapenZenbakia.setEnabled(true);
            // ComboBox-ak ezgaitu
            comboErreserbaAgentea.setEnabled(false);
            comboIrteerarenLekua.setEnabled(false);
            comboPertsonaKopurua.setEnabled(false);
            comboIrteerarenEgunak.setEnabled(false);
            comboIrteeraData.setEnabled(false);
        }
        if (event.getSource() == botoiaSartuIrteera) {
            Date irteeraData = null;
            // Sarrera
            // Hau moldatu in berkoyau; kodia Irteerak taulatik lortu adibidez.
            int irteeraKodea = LoturaErreserbaSistema.getLoturaErreserba().getIrteeraKod(); 
            String strIrteeraData = (String)comboIrteeraData.getSelectedItem();
            try {
                irteeraData = dataFormat.parse(strIrteeraData);
            } catch (ParseException e) {
            }
            try {
                int baieztapenZenbakia = Integer
                        .parseInt(testuEremuaBaieztapenZenbakia.getText());
                // Ereduak sartu
                LoturaErreserbaSistema.sartuIrteera(baieztapenZenbakia,
                        irteeraKodea, irteeraData);
                // Botoiak ipini
                botoiaErreserbaBerria.setEnabled(false);
                botoiaSartuIrteera.setEnabled(false);
                botoiaSartuTurista.setEnabled(true);
                botoiaSartuBidali.setEnabled(false);
                botoiaSartuEzeztatu.setEnabled(false);
                // Testu eremuen egoerak eguneratu
                testuEremuaBaieztapenZenbakia.setEnabled(false);
                testuEremuaIzena.setEnabled(true);
                testuEremuaHelbidea.setEnabled(true);
                testuEremuaTelefonoa.setEnabled(true);
            } catch (NumberFormatException numberFormatException) {
                JOptionPane.showMessageDialog(new JFrame(),
                        "Mesedez zenbaki oso bat sartu",
                        "Sarrera errore mezua", JOptionPane.WARNING_MESSAGE);
            }
        }
        if (event.getSource() == botoiaSartuTurista) {
            // Sarrera
            String izena = testuEremuaIzena.getText();
            String helbidea = testuEremuaHelbidea.getText();
            String telefonoa = testuEremuaTelefonoa.getText();

            // Egiaztatu datu guztiak bete direla
            if (izena.equals("") || helbidea.equals("") || telefonoa.equals("")) {
                JOptionPane.showMessageDialog(new JFrame(),
                        "Mesedez bete turistaren datu guztiak",
                        "Sarrera errore mezua", JOptionPane.WARNING_MESSAGE);
            } else {
                try {
                    // egiaztatu telefonoa zenbakiz osatuta dagoela
                    Integer.parseInt(telefonoa);

                    // Ereduak sartu
                    LoturaErreserbaSistema.sartuTurista(izena, helbidea,
                            telefonoa);
                    // Botoiak eguneratu
                    botoiaErreserbaBerria.setEnabled(false);
                    botoiaSartuIrteera.setEnabled(false);
                    botoiaSartuTurista.setEnabled(false);
                    botoiaSartuBidali.setEnabled(true);
                    botoiaSartuEzeztatu.setEnabled(true);
                    // Testu eremuen egoerak eguneratu
                    testuEremuaIzena.setEnabled(false);
                    testuEremuaHelbidea.setEnabled(false);
                    testuEremuaTelefonoa.setEnabled(false);
                } catch (NumberFormatException numberFormatException) {
                    JOptionPane
                            .showMessageDialog(new JFrame(),
                                    "Mesedez ongi idatzi telefono zenbakia",
                                    "Sarrera errore mezua",
                                    JOptionPane.WARNING_MESSAGE);
                }
            }
        }
        if (event.getSource() == botoiaSartuBidali) {
            // Erreserba guztia datu-basean sartu
            LoturaErreserbaSistema.submit();
            // Botoiak ipini
            botoiaErreserbaBerria.setEnabled(true);
            botoiaSartuIrteera.setEnabled(false);
            botoiaSartuTurista.setEnabled(false);
            botoiaSartuBidali.setEnabled(false);
            botoiaSartuEzeztatu.setEnabled(false);
            // Testu eremuak ezabatu
            testuEremuaBaieztapenZenbakia.setText("");
            testuEremuaIzena.setText("");
            testuEremuaHelbidea.setText("");
            testuEremuaTelefonoa.setText("");
            // ComboBox-a gaitu
            comboErreserbaAgentea.setEnabled(true);
        }
        if (event.getSource() == botoiaSartuEzeztatu) {
            // Ereduak sartu
            LoturaErreserbaSistema.ezeztatu();
            // Botoiak ipini
            botoiaErreserbaBerria.setEnabled(true);
            botoiaSartuIrteera.setEnabled(false);
            botoiaSartuTurista.setEnabled(false);
            botoiaSartuBidali.setEnabled(false);
            botoiaSartuEzeztatu.setEnabled(false);
            // Testu eremuak ezabatu
            testuEremuaBaieztapenZenbakia.setText("");
            testuEremuaIzena.setText("");
            testuEremuaHelbidea.setText("");
            testuEremuaTelefonoa.setText("");
        }
    }


    public void itemStateChanged(ItemEvent itemStateChanged) {
        
        if (itemStateChanged.getSource() == comboErreserbaAgentea
                && itemStateChanged.getStateChange() == ItemEvent.SELECTED) {
            if (comboErreserbaAgentea.getSelectedIndex() == 0) {
                // Ezabatu ComboBox-etako informazioa
                comboIrteerarenLekua.removeAllItems();
                comboPertsonaKopurua.removeAllItems();
                comboIrteerarenEgunak.removeAllItems();
                comboIrteeraData.removeAllItems();
                LoturaIrteera = null;
            } else { // Benetako agentea aukeratu da.
                System.out.println(comboErreserbaAgentea.getSelectedItem()
                        .toString()
                        + " agentea aukeratu da.");
                try {
                    // Gaitu ComboBox-ak
                    comboIrteerarenLekua.setEnabled(true);
                    comboPertsonaKopurua.setEnabled(true);
                    comboIrteerarenEgunak.setEnabled(true);
                    comboIrteeraData.setEnabled(true);
                    // Eskuratu urruneko objektua
                    Agentea agentea = AplikazioDatuBase.instance().getAgentea(
                            comboErreserbaAgentea.getSelectedItem().toString());
                    AgenteInterfazea agenteRMI = (AgenteInterfazea) Naming
                            .lookup("rmi://" + agentea.getUrl() + "/agenteRmi");
                    irteerakArray = agenteRMI.getIrteerak().clone();
                    comboIrteerarenLekua.removeAllItems();
                    comboIrteerarenLekua.addItem("Aukeratu lekua");
                    for (int i = 0; i < irteerakArray.length; i++) {
                        this.comboIrteerarenLekua
                                .addItem(irteerakArray[i].getLekua());
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        if (itemStateChanged.getSource() == comboIrteerarenLekua
                && itemStateChanged.getStateChange() == ItemEvent.SELECTED) {
            if (comboIrteerarenLekua.getSelectedIndex() != 0) {
                // Leku bat aukeratu da
                System.out.println(comboIrteerarenLekua.getSelectedItem()
                        .toString()
                        + " aukeratu da noranzko gisa.");
                LoturaIrteera = irteerakArray[comboIrteerarenLekua.getSelectedIndex()-1];
                try {
                    // Ezarri pertsona kopurua
                    this.comboPertsonaKopurua.removeAllItems();
                    this.comboPertsonaKopurua.addItem("Aukeratu pertsona kopurua");
                    for (int i = 1; i <= this.LoturaIrteera.getPertsonaKop(); i++) {
                        this.comboPertsonaKopurua
                                .addItem(String.valueOf(i));
                    }
                    // Ezarri egun kopurua
                    this.comboIrteerarenEgunak.removeAllItems();
                    this.comboIrteerarenEgunak.addItem("Aukeratu egun kopurua");
                    int[] egunKopArray = this.LoturaIrteera.getEgunak();
                    for (int j = 0; j < egunKopArray.length; j++) {
                        this.comboIrteerarenEgunak.addItem(egunKopArray[j]);
                    }
                    // Ezarri datak
                    this.comboIrteeraData.removeAllItems();
                    this.comboIrteeraData.addItem("Aukeratu irteera data");
                    String[] datakArray = this.LoturaIrteera.getDatak();
                    for (int k = 0; k < datakArray.length; k++) {
                        this.comboIrteeraData.addItem(datakArray[k]);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

}
